﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;

namespace Dye_Lib
{
   
    public class Project
    {   
        
        private BinaryManager<List<Diagram>> binDiagrammen;        
        
        private List<Diagram> diagrammen;
        public List<Diagram> Diagrammen
        {
            get { return diagrammen; }
            set { diagrammen = value; }
        }
        #region Singleton Constructor
       
        private static Project instance;
        
        private Project()
        {
            diagrammen = null;
            binDiagrammen = new BinaryManager<List<Diagram>>();
        }
       
        public static Project Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Project();
                }
                return instance;
            }
        }
        #endregion 
       
     
        /// <summary>
        /// state: 0 = begin, 1 = Opslaan?, 2 = Doorgaan?, default = error 
        /// antwoord: 0 = None, 6 = Ja, 7 = Nee
        /// </summary>
        /// <param name="state"></param>
        /// <param name="antwoord"></param>
        /// <param name="locatie"></param>
        /// <returns></returns>
        
        public int Nieuw(int state, int antwoord)
        {
            switch (state)
            {
                case 0://begin
                    if (diagrammen == null)
                    {
                        diagrammen = new List<Diagram>();
                        return 0;//succes
                    }
                    else if (diagrammen != null) return 1;//Vraag: Opslaan?
                    else return 6;//error
                case 1://Antwoord op: Opslaan?
                    if (antwoord == 6) { return 2; }//SaveFileDialog
                    else if (antwoord == 7) { return 3; }//Vraag: Doorgaan?
                    else return 6; //error
                case 2://Antwoord op: Doorgaan?
                    if (antwoord == 6)// Ja
                    {
                        if (diagrammen != null)
                        {
                            diagrammen = null;
                            return 4;//Verwijder Control
                        }
                        else return 6;//error
                    }
                    else if (antwoord == 7)// Nee
                    {
                        return 5;//geannuleerd
                    }
                    else return 6;//error
                default://Error
                    return 6;//error
            }
        }
        
        public bool NieuwDiagram(DiagramType type)
        {
            /*
             * Voeg een nieuw diagram toe, mits er een project geopent is.
             * */
            if (diagrammen != null)
            {
                diagrammen.Add(new Diagram(type));
                return true;
            }
            else
                return false;
        }
        
        public int Openen(int state, int antwoord, string locatie)
        {
            bool doorgaan;
            if (diagrammen == null) doorgaan = true;
            else doorgaan = false;
            
            switch (state)
            {
                case 0://controlle begin fase
                    if (doorgaan == true)
                    {       
                        return 0;//OpenFileDialog
                    }
                    else if (doorgaan == false) return 2;//Vraag: Opslaan?     
                    else return 6;//error                    
                case 1://OpenFileDialog keuze
                    if (antwoord == 1)
                    {
                        try
                        {
                            diagrammen = null;
                            diagrammen = binDiagrammen.Load(locatie);                            
                            return 1;//succes
                        }
                        catch
                        {
                            return 6;//error
                        }
                    }
                    else if (antwoord == 0 || antwoord == 2)//Openfinedialog geannuleerd
                    {                        
                        return 5;//annuleerd
                    }
                    else { return 6; }  //error
                case 2://Antwoord: Opslaan
                    if (antwoord == 6) { return 3; }//UC004
                    else if (antwoord == 7) { return 4; }//Vraag: Doorgaan?
                    else return 6; //error
                case 3://Antwoord: Doorgaan
                    if (antwoord == 6)// Ja
                    {                        
                            doorgaan = true;
                            goto case 0;//OpenFileDialog                       
                    }
                    else if (antwoord == 7)// Nee
                    {
                        return 5;//geannuleerd
                    }
                    else return 6;//error
            }
            return 0; 
        }

        /// <summary>
        /// state: 0 = SaveFileDialog, 1 = Opslaan
        /// antwoord: 0 = None, 1 = Ok, 2 = Cancel
        /// locate: saveFileDialog bestands lokatie;
        /// </summary>
        /// <param name="state"></param>
        /// <param name="antwoord"></param>
        /// <param name="locatie"></param>
        /// <returns></returns>
        
        public int Opslaan(int state, int antwoord, string locatie)
        {
            switch (state)
            {
                case 0:
                    return 0;
                case 1:
                    if (antwoord == 1)
                    {
                        try
                        {
                            binDiagrammen.Save(locatie, diagrammen);
                            return 1;
                        }
                        catch
                        {
                            return 0;
                        }
                    }
                    else if (antwoord == 0 || antwoord == 2)
                    { return 2; }
                    else { return 3; }
                default:
                    return 3;
            }
        }
        
        public void AddKlasse(int newMousePosX, int newMousePosY, int activeDiagram, string naam)
        {
            diagrammen[activeDiagram].AddKlasse(newMousePosX, newMousePosY, naam);
        }
        
        public void Draw(Graphics g, int diagramNr, int offsetX, int offsetY)
        {
            diagrammen[diagramNr].Draw(g, offsetX, offsetY);
        }

        public Component SelecteerObject(int activeDiagram, Point point, int screenOffsetX, int screenOffsetY)
        {
            return diagrammen[activeDiagram].SelecteerObject(point, screenOffsetX, screenOffsetY);
        }

        public void VerplaatsObject(int activeDiagram, Point point)
        {
            diagrammen[activeDiagram].VerplaatsObject(point);
        }

        public void WijzigDiagram(int Diagram, string naam)
        {
            diagrammen[Diagram].Naam = naam;
        }

        public void PlaatsObject(int activeDiagram)
        {
            diagrammen[activeDiagram].PlaatsObject();
        }        
    }
}
